------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
Kinky World - CHANGELOG b444 v0.8.7 - 26 Mar 2026
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------


1) Version update
- Hardcoded version updated to "v0.8.7 (Build 444)".
- "KinkyMod" values:
  - "sRevision = 7"
  - "sBuild = 444" (unchanged)

2) Incest scope gating over-block fix (implemented)
- Issue observed:
  - with "IncestActiveHouseholdOnly = true", some non-incest base romantic flows could be blocked outside active household.
- Root cause:
  - in "SimTools.AreSufficientlyRelatedToRuleOutRomance(...)", the "IncestLevels.BloodRelated" branch used "!IsIncestScopeAllowed(...)" as a generic blocker, even for non-related pairs.
- Fix:
  - relation checks are now explicit and evaluated first:
    - blood-related
    - future blood-related
    - step-related
  - scope gating ("IsIncestScopeAllowed") is now applied only when the pair is actually incest-relevant.
  - unrelated sims now correctly return "false" (not ruled out) in this gate.
- Behavioral result:
  - "IncestActiveHouseholdOnly" remains effective for incest mechanics,
  - base romantic behavior for non-related sims outside household is no longer hard-blocked by this setting.

2.1) Incest logic clarification (current expected behavior)
- Scope toggle default:
  - "IncestActiveHouseholdOnly = false" (default).
- Level + scope behavior:
  - "IncestLevel = Disabled":
    - incest is blocked (scope toggle is effectively irrelevant in this level).
  - "IncestLevel = StepRelated":
    - step-related incest can be allowed;
    - blood/future-blood incest remains blocked;
    - if "IncestActiveHouseholdOnly = true", allowed step-related cases are limited to active household scope.
  - "IncestLevel = BloodRelated":
    - blood + future-blood + step-related incest can be allowed;
    - if "IncestActiveHouseholdOnly = true", allowed incest cases are limited to active household scope.
- Non-related safety:
  - for non-related pairs (neither blood nor step), these incest settings no longer apply blocking outside household;
  - this prevents unintended impact on non-incest romantic/kinky flows.

3) Build verification
- Build script: "build_experimental.ps1"
- Result: successful compile (warnings only, no new errors).

4) Notes
- This changelog documents only the delta from "b444 v0.8.6".
- Previous implemented features for Build 444 remain documented in:
  - "CHANGELOG-b444-v086"

5) STBL editings
0x65F4C62991DE9A91
EN (ORIGINAL): WooHoo Join: Rejected
EN (FIXED): No, I don't want to join that!
IT (FIXED): No, non voglio unirmi!

0xA8975B9C729A0899
EN (ORIGINAL): WooHoo Join: Stage Rejected
EN (FIXED): No, I don't feel like I want to join such a stage join with you!
IT (FIXED): No, non mi va di unirmi a una posizione del genere!







------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
Kinky World - CHANGELOG b444 v0.8.6 - 25 Mar 2026
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------



1) Version update
- Hardcoded version updated to "v0.8.6 (Build 444)".
- "KinkyMod" values:
  - "sRevision = 6"
  - "sBuild = 444"



2) New WooHoo control option (slave)
- Added new setting: "IncludeEveryHouseholdSimInForcePromptLogic" (default "false").
- Placement in settings UI:
  - "Settings -> WooHoo/Sex"
  - inserted directly below the master prompt option.



3) Prompt logic extension (strict gated behavior)
- Implemented new player-directed household prompt path in "WooHooSequence.GetResult()".
- Prompt is forced only when all required conditions are true:
  - interaction is player-directed ("!Autonomous")
  - master is enabled: "SelectableSimsAlwaysPromptOnIncomingWooHoo = true"
  - slave is enabled: "IncludeEveryHouseholdSimInForcePromptLogic = true"
  - prompt UI is shown when "WooHooAutoConfirm = false"
  - if "WooHooAutoConfirm = true", prompt-QoL branches resolve as auto-yes (complementary behavior), not by opening dialog
  - actor is active/selectable household sim
  - target is selectable, human, inactive, and in active household
- This does not alter autonomous/NPC score flow outside intended scope.



4) Settings migration safety
- Upgrade gate updated to include Build 444 migration path:
  - settings initialization block moved from "< 443" to "< 444"
- Reason:
  - ensure saves already on Build 443 correctly receive new persistable option.



5) Localization keys
- "0xD1789083937EF94A"
  - EN: "Household Sims always receive a prompt"
  - IT equivalents has been generated
- "0x205BDEC3C93374A2"
  - EN: "Force prompt in every possible Household situation"
  - IT equivalents has been generated



6) Validation status
- In-game user validation: passed.
- Behavior confirmed working as intended in real gameplay tests.
- Settings persistence confirmed working.
- Persistence scope per-save (no cross-save leakage) is the same applied from b443.



7) New player-directed arousal bypass options
- Added setting: "IgnoreArousalInRomanticRelationshipsPlayerDirected" (default "false").
- Added setting: "IgnoreArousalInNormalRelationshipsPlayerDirected" (default "false").
- Placement in settings UI:
  - "Settings -> WooHoo/Sex"
  - both added directly below the prompt slave option.
- Labels clarified for user-facing meaning:
  - "Age Restriction (on stages)"
  - "Gender Restriction (on stages)"
- Clarification:
  - both options control WooHoo stage compatibility constraints ("Ages"/"Genders" flags on stages),
  - meaning they are not generic social-orientation toggles.
- Relationship split behavior:
  - romantic bucket: partner/romantic relationships
  - normal bucket: non-romantic relationships gated to friend-tier or higher (">= friend")
- Scope:
  - applies only to player-directed flow
  - not limited to household-only targets
  - can affect invited/non-household Sims when interaction is player-directed
- Safety:
  - hard rejects and base gate checks remain intact
  - no change to autonomous/NPC global behavior
  - when disabled (default), these options do not alter legacy acceptance flow



8) Arousal bypass refinement ("surgical arousal")
- Refined "WooHooSequence" bypass to avoid broad accept behavior.
- Bypass now applies only in tightly constrained low-arousal cases:
  - outcome bucket is "Rejected"/"Awkward"
  - target is not aroused and has very low "WooHooMotive"
  - no strong cheating block ("CanCheatWith" must allow)
  - no strongly negative relationship ("LTR < -25")
  - for non-romantic bucket: requires an existing positive relationship
- Practical result:
  - preserves "ignore arousal" accessibility intent,
  - avoids near-guaranteed acceptance in edge cases (e.g. unknown/some married NPC scenarios),
  - keeps non-arousal legacy constraints meaningful.
- Clarification:
  - these options reduce arousal impact at WooHoo entry/acceptance only,
  - WooHoo continuation pacing and outcome progression remain legacy-driven and can still reflect low arousal.



9) Arousal options persistence and migration
- Both arousal options are persistable settings.
- Added default registration in "ResetSettings()".
- Added migration block in "Upgrade()" for older versions.



9.1) Whole-loop arousal bypass slave (implemented)
- Added setting: "IgnoreArousalScoreInWholeLoop" (default "false").
- Placement in settings UI:
  - "Settings -> WooHoo/Sex"
  - inserted directly below the two arousal master options.
- Slave behavior and scope:
  - applies only when at least one master option is active for the current relationship bucket:
    - "IgnoreArousalInRomanticRelationshipsPlayerDirected"
    - "IgnoreArousalInNormalRelationshipsPlayerDirected"
  - applies only to player-directed WooHoo loop flow.
  - does not apply to "TryForBaby", rape flow, or autonomous flow.
- Surgical loop extension:
  - implemented in "WooHooJoin.StageAccepted(...)".
  - only converts stage reject paths caused by low arousal score mismatch.
  - does not bypass hard blockers (e.g. cheating constraints, strongly negative relationship gates, non-arousal hard conditions).
- Non-romantic bucket refinement:
  - effective condition is now: non-romantic AND relationship tier ">= friend".
  - applied consistently to both entry acceptance ("WooHooSequence") and whole-loop bypass checks ("WooHooJoin").



9.2) Build 444 follow-up fixes implemented
- Sleep WooHoo reject accounting fixed:
  - in "KWBedSleep" wake/reject branch ("AwakeRejected"), "PostWooHoo(...)" is no longer called before abort.
  - rejected wake paths are no longer counted as completed WooHoo events (prevents false cheating/rape-side accounting from that branch).
- Incest "StepRelated" helper fixed:
  - "SimTools.AreStepRelated(Sim actor, Sim target)" now correctly calls step-related genealogy logic instead of blood-related logic.
- New incest scope option added:
  - setting key: "IncestActiveHouseholdOnly" (default "false").
  - placement: directly below incest level in "Settings -> Global".
  - behavior:
    - "false" => legacy/global incest scope.
    - "true" => incest mechanics limited to Sims in active household scope checks.
  - scope helper integrated in central relation gate and major incest-gated social/WooHoo tests.
- Build 444 migration alignment:
  - new settings in this wave are aligned to Build 444 migration boundary ("PreviousVersion < 444")



9.3) Teen/YA auto-alignment option (implemented)
- Added setting: "AutoMoveUpTeenWithYoungAdultPartners" (default "false", persistable per-save).
- Placement in settings UI:
  - "Settings -> WooHoo/Sex"
  - added directly below "IgnoreArousalScoreInWholeLoop".
- Runtime scope:
  - applied in both "WooHooInstance.PlaceActor(...)" (starter placement) and "WooHooInstance.PlaceActorNext(...)" (loop/sequence transitions).
  - only applies when:
    - option is enabled,
    - current placed Sim is Teen,
    - interaction is not solo,
    - at least one other participant is "YoungAdultOrAbove".
- Movement semantics:
  - applies offset to the Teen participant:
    - vertical ("Move Up") "+0.04f"
    - lateral left ("Move Left") "-0.002f"
  - subtle left fine-tuning is intentionally decoupled from user move-step value to target visual clipping edge cases.
- Follow-up correction in same build line:
  - corrected to "+0.04f" and guarded in "PlaceActorNext(...)" to avoid cumulative re-application when reusing cached offset ("value.Offset").
  - added small fixed left offset "-0.002f" under the same non-cumulative guard.



9.4) Settings entrypoint expansion (implemented)
- Extended "Kinky World... > Settings" availability from Sim-only to additional click contexts:
  - terrain click
  - generic object click
- Implementation:
  - added "Oniki.Interactions.ShowSettingsOnTerrain" ("ImmediateInteractionGameObjectHit<Sim, Terrain>")
  - added "Oniki.Interactions.ShowSettingsOnObject" ("ImmediateInteraction<Sim, IGameObject>")
  - both call "OptionSettings.Show()" and use localized interaction label "ShowSettings.InteractionName".
- Registration:
  - expansion introduced object/terrain-aware Settings entrypoints during this Build 444 wave.
  - final active injector registration is kept centralized in "Main.Start()" with:
    - "Sim" + "IGameObject" registration.
  - kept existing Sim registration unchanged.
- UX guardrail:
  - object-target entrypoint explicitly excludes "Sim" targets to avoid duplicate Settings entries on Sims.
  - object-target entrypoint now also excludes "Terrain" targets to avoid duplicate Settings entries on terrain clicks (terrain keeps a single dedicated entrypoint).



9.5) Failed-stage warning mode for modders (implemented)
- Added setting: "EnableDebugNotificationForFailedStages" (default "false", persistable per-save).
- Placement in settings UI:
  - "Settings -> Misc"
  - added directly below "DebugInteractionLogging".
- Runtime behavior in "WooHooInstance.ChangeStage(...)":
  - when "false": shows user-friendly localized warning messages ("PendingJoin", "AlreadyQueued", "PostureNotSupported", "SetupFailed").
  - when "true": shows technical hardcoded detail messages useful for modders (queued stage key, requested stage key, posture mismatch, setup fail reason).
- Notification channel/style remains warning-based with actor context (same red warning style and Sim-linked thumbnail behavior as before).



9.6) Migration preservation policy hardening (implemented)
- Build 444 migration blocks in "Settings.Upgrade()" were hardened to preserve existing serialized values:
  - changed from unconditional assignment ("mValues["Key"] = ...") to add-only-if-missing behavior.
- Practical migration result:
  - from "443 -> 444": settings already present in save keep user values; missing keys are initialized with existing defaults.
  - from "444 -> future builds" (e.g. potential "445"): values already saved by users remain preserved.
- Scope:
  - applies to the Build 444 wave settings (including both previously existing options and newly added options touched by "< 444" upgrade blocks).
- Defaults policy:
  - default values remain defined by "ResetSettings()" and were not changed by this hardening pass.
- Safety fallback policy:
  - if a specific option later proves problematic when preserved, that key can be switched to an explicit migration reset/remap in "Upgrade()" while keeping "ResetSettings()" as the default source-of-truth.



9.7) Main settings menu: reset-all action (implemented)
- Added a new reset action in main settings menu:
  - "ResetAllSettings" (localized UI action).
- Behavior:
  - asks one confirmation dialog before execution.
  - applies runtime reset through "Settings.ResetToDefaults(...)" ("ResetSettings()" + "Apply()").
  - shows localized done/fail result dialog.
- Persistence semantics correction:
  - reset action no longer forces immediate "ExportBin" write.
  - behavior now matches normal settings workflow: changes are runtime-only until user saves the game.
  - if user exits without saving, reset state is not persisted in the reloaded save.
- Implementation files:
  - "Oniki.UI/ResetAllSettings.cs" (new)
  - "Oniki.UI/OptionSettings.cs" (menu entry)
  - "Oniki/Settings.cs" (public reset helper)
  - "Oniki_KinkyMod.csproj" (compile include)
- UX follow-up:
  - "ResetAllSettings" entry moved near import/export controls (immediately below "ImportSettings") for menu logic consistency.
  - entry is now shown only when mod state is enabled ("Main.Settings.Enabled == true"), and hidden in disabled/uninstalled states.



9.8) Localization cleanup: orphan IT-only arrest key (implemented)
- Removed orphan string hash from IT package:
  - "0xE3DDDFC764888F3C"
- Reason:
  - key has no EN counterpart in current string packages,
  - linked callsite is legacy commented code ("ArrestSim.SituationFeedback:YouAreUnderArrest"), not active runtime behavior.
- Expected impact:
  - no runtime behavior change; cleanup of unused localization residue only.



9.9) WooHoo defaults rebalance (implemented)
- Lowered default values for both settings:
  - "WooHooFatigue": "50" -> "25"
  - "WooHooAthleticGain": "50" -> "25"
- Applied in default initialization paths:
  - "ResetSettings()"
  - migration initialization block where keys are created for older versions.
- Scope note:
  - this changes defaults for new/missing-key initialization only;
  - existing user-saved values are preserved unless user resets settings or updates them manually.



9.10) WooHooAutoConfirm + prompt QoL compatibility pass (implemented)
- Menu UX order update ("Settings -> WooHoo/Sex"):
  - moved "WooHooAutoConfirm" directly below "IncludeEveryHouseholdSimInForcePromptLogic".
- Runtime compatibility update in "WooHooSequence.GetResult()":
  - "WooHooAutoConfirm" remains a legacy option (not a new QoL setting),
  - when prompt QoL options are OFF, behavior remains legacy for this area,
  - when prompt QoL options are ON and "WooHooAutoConfirm = true", hypothetical prompt branches are resolved as auto-accept (auto-yes) instead of being skipped as conflict,
  - when prompt QoL options are ON and "WooHooAutoConfirm = false", existing prompt dialog behavior remains unchanged.
- Hard-fail safety:
  - non-prompt hard rejects are unchanged and still evaluated before prompt/auto-confirm resolution.



9.11) Player-directed target interrupt gate for KW requests (implemented)
- Added setting: "PlayerDirectedInterruptTargetForKinkyRequests" (default "false", persistable per-save).
- Placement in settings UI:
  - "Settings -> Global"
  - inserted directly below "Teens" and above "Pubic hairs".
- Centralized gate implementation:
  - added helper "SimTools.TryInterruptTargetForPlayerDirectedKinkyRequest(Sim actor, Sim target, bool isAutonomous)".
  - intent: if enabled, reduce long waits where target keeps finishing non-critical tasks before joining KW interaction.
- Guardrails (legacy-safe):
  - active only when setting is "true".
  - active for:
    - player-directed requests ("isAutonomous == false"),
    - autonomous requests only when initiator belongs to active household ("actor.Household == Household.ActiveHousehold").
  - requires initiator to be selectable ("actor.IsSelectable").
  - autonomous safety exclusion:
    - no interrupt when a non-active household initiator targets the currently controlled household Sim ("target.IsActiveSim" or "PlumbBob.SelectedActor == target").
  - does not run if target is sleeping.
  - does not interrupt "IKinkyInteraction" already running.
  - does not interrupt "MustRun" or "CriticalNPCBehavior+" interactions.
  - if interrupt attempt fails, flow falls back to legacy queue behavior (no hard fail side effects).
- Integration points:
  - "Oniki.Interactions.KWSocialInteraction" before passive sync push on target queue.
  - "Oniki.Interactions.WooHooJoin" before "InsertNextInteraction(...)" on join target.
  - "Oniki.Interactions.WooHooSequence" before target participant "WooHooGoTo" continuation/queue push.
- Migration/default registration:
  - added in "Settings.ResetSettings()" with default "false".
  - added in "Settings.Upgrade()" under Build 444 migration boundary ("PreviousVersion < 444") with add-if-missing behavior.



9.12) Duplicate Settings on doors/arches: final fix and validation (implemented)
- Issue:
  - "Kinky World... > Settings" could appear twice on some object targets (mainly doors/arches).
- Final root cause:
  - overlap of settings-entry providers on door/arch targets in some runtime states, causing duplicate visible rows.
- Final applied fix:
  - "ShowSettingsOnObject" now excludes door/arch object types (".Objects.Door." / "Arch") in "Definition.Test(...)".
  - dedupe guards remain in place for generic "ShowSettings*" interaction paths.
- Validation:
  - live log review confirmed this is target-specific overlap (not a global duplicate-injection issue),
  - in-game result: duplicate "Settings" row removed on doors/arches while keeping normal settings access/persistence.
- Logging cleanup linked to this diagnostic cycle:
  - temporary high-volume "settings" diagnostic traces were removed,
  - "DebugInteractionLogging" was returned to normal notification-trace scope.
  - deep object-definition trace helper is kept commented in "ShowSettingsOnObject" for future targeted troubleshooting.



9.13) KWErrorLog hard gate when user toggle is OFF (implemented)
- Strengthened "LogKWErrorOnQuit" behavior as strict runtime gate for "KWErrorLog_" channel.
- "Log.Dump()" now checks settings first:
  - if "LogKWErrorOnQuit = false", "KWErrorLog_..." file is never emitted,
  - includes forced dump paths (manual "Log.Dump()" calls and auto-dump threshold flow).
- Scope note:
  - this hard gate applies specifically to "KWErrorLog_" export channel and does not change "KWStartup_", "KW_Localization", or "KWInteractionLog_" toggles/flows.



9.14) STBL details (canonical format - IT strings were added as well but not always included here)
- "Oniki.KinkyMod.OptionSettings.IgnoreArousalInRomanticRelationshipsPlayerDirected"
  - "0xC29044141A5A21B4"
  - "EN: Ignore arousal score in player's romantic relationships"

- "Oniki.KinkyMod.OptionSettings.IgnoreArousalInNormalRelationshipsPlayerDirected"
  - "0x10DFA0D4EF6C8DE0"
  - "EN: Ignore arousal score in normal relationships (player-only)"

- "Oniki.KinkyMod.OptionSettings.IncestActiveHouseholdOnly"
  - "0xE68F5A0BFF60479C"
  - "EN: Limit incest mechanics to Household Sims only"

- "Oniki.KinkyMod.OptionSettings.IncludeEveryHouseholdSimInForcePromptLogic"
  - "0x205BDEC3C93374A2"
  - "EN: Force prompt in every possible Household situation"

- "Oniki.KinkyMod.OptionSettings.IgnoreArousalScoreInWholeLoop"
  - "0xCE3548342C54B13C"
  - "EN: Ignore arousal score for the whole WooHoo loop"
  - "IT: Ignora valori eccitazione per tutto il flusso Fiki Fiki"

- "Oniki.KinkyMod.OptionSettings.AutoMoveUpTeenWithYoungAdultPartners"
  - "0x9539C095C3F24DA5"
  - "EN: Fix Teens position in adults animations"
  - "IT: Correggi posizione Teens in animazioni con adulti"

- "Oniki.KinkyMod.WooHoo.ChangeStage.Warning.PendingJoin"
  - "0xD6230B3836CD5381"
  - "EN: I can't change position now, I'm waiting for a partner to join!"
  - "IT: Non posso cambiare posizione ora, sto aspettando che qualcuno si unisca!"

- "Oniki.KinkyMod.WooHoo.ChangeStage.Warning.AlreadyQueued"
  - "0x9851105FAA86175F"
  - "EN: I can't change position now, another change is already queued!"
  - "IT: Non posso cambiare posizione ora, un altro cambio è già in coda!"

- "Oniki.KinkyMod.WooHoo.ChangeStage.Warning.PostureNotSupported"
  - "0xAD71830EB01B4477"
  - "EN: I can't change position now, that stage is not compatible with the current posture!"
  - "IT: Non posso cambiare posizione ora, quello stage non è compatibile con la postura attuale!"

- "Oniki.KinkyMod.WooHoo.ChangeStage.Warning.SetupFailed"
  - "0x142C8F32F441B80C"
  - "EN: I can't change position now, that stage setup failed!"
  - "IT: Non posso cambiare posizione ora, il setup di quello stage non è riuscito!"

- "Oniki.KinkyMod.OptionSettings.EnableDebugNotificationForFailedStages"
  - "0xF2812CE14BCFB883"
  - "EN: Debug notifications for failed stages"
  - "IT: Notifiche di debug per stage falliti"

- "Oniki.KinkyMod.OptionSettings.PlayerDirectedInterruptTargetForKinkyRequests"
  - "0x3D9AF344D4DB6FE7"
  - "EN: Interrupt NPC interactions when needed"
  - "IT: Interrompi interazioni NPC quando richiesto"

- "Oniki.KinkyMod.OptionSettings.ResetAllSettings:Title"
  - "0xC97222AE546CFC24"
  - "EN: Reset All Settings"
  - "IT: Resetta tutte le impostazioni"

- "Oniki.KinkyMod.OptionSettings.ResetAllSettings:Confirm1"
  - "0x7B73B1B8D1F1F483"
  - "EN: This will reset all Kinky World settings to default values. Are you sure?"
  - "IT: Quest'operazione reimposterà tutti i valori delle impostazioni a quelli di default. Vuoi davvero proseguire?"

- "Oniki.KinkyMod.OptionSettings.ResetAllSettings:Caption"
  - "0x8619F7EEC11AF18C"
  - "EN: Kinky World"
  - "IT: Kinky World"

- "Oniki.KinkyMod.OptionSettings.ResetAllSettings:Done"
  - "0x1CFA462822711256"
  - "EN: Settings reset completed. Save the game to keep changes and reload it for better results."
  - "IT: Impostazioni resettate correttamente. Salva la partita per mantenere i cambiamenti e ricaricala per risultati migliori."

- "Oniki.KinkyMod.OptionSettings.ResetAllSettings:Fail"
  - "0x0AE2F92817FAEC3E"
  - "EN: Reset operation failed due to an exception. Please try again."
  - "IT: Reset impostazioni fallito a causa di un'eccezione. Per favore, riprova."

- "Oniki.KinkyMod.WooHooJoin.InteractionFeedback:StageRejected"
  - "0x1C521EF9667FFBC2"
  - "EN: No, such a join with you it's really not that inspiring!"
  - "IT: No, non mi ispira unirmi in quella posizione assieme a voi!"


9.15) STBL text-only fixes (only IT fixes, EN is for reference)
Edited a lot of IT text that is not entirely reported in this changelog, because it would have required an infinite amount of time.

- 0x5A9517451A03E07B
- EN: Be Kissed Passionately
- IT (FIXED): Ricevi un bacio Kinky

- 0x2DE0AC0392547B7C
- EN: Injecting Kinky Interactions: {0.Number}%
- IT (FIXED): Inserimento delle interazioni Kinky: {0.Number}%

- 0x64FAF5CB579067AB
- EN: Kinky Version Upgrade
- IT (FIXED): Aggiornamento versione Kinky

- 0x7BCC72B9D339E5E3
- EN: Enable chance to receive Bloody Vagina from Rough Sex 
- IT (FIXED): Possibilità vagina sanguinante da sesso violento

- 0x79A8A35967BE59CD
- EN: Show Feet
- IT (NEW): Mostra i piedi

- 0xC666AFD2EB75FF48
- EN: Show {MA.Cock}{FA.Pussy}
- IT (FIXED): Mostra {MA.l'uccello}{FA.la passera}

- 0x5B94CEA63E4D50B0
- EN: Show Her Boobs
- IT (FIXED): Mostrarti le sue tette

- 0x8DB7401D8AFB8949
- EN: Respond To Question
- IT (FIXED): Rispondi alla domanda Kinky

- 0xE86AF04DD02B451A
- EN: Answer the question
- IT (FIXED): Rispondi alla domanda Kinky

- 0x1C521EF9667FFBC2
- EN: No, such a join with you it's really not that inspiring!
- IT (FIXED): No, non mi ispira unirmi in quella posizione assieme a voi!

- 0x180C05CEC6FF8505
- EN: Oh no, never with you!
- IT (FIXED): Assolutamente no! Ed è anche imbarazzante, non credi?

- 0x7DEF9FE29DB5F663
- EN: Sleep On Couch
- IT: Dormi sul divano








------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
Kinky World - CHANGELOG b443 v0.8.5 - 18 Mar 2026
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------

Snapshot Identity
- Base source: OnikiKinkyMod.Build442.v083
- Target version: v0.8.5
- Target build: 443


1) Goal and design intent
- Reduce player-command friction for active/selectable Sims while preserving NPC autonomy.
- Keep behavior toggleable at runtime through settings.
- Improve rejection feedback clarity and localization coverage.
- Add operational logging controls and a dedicated interaction debug trace.

2) New settings (final state)
File: OKW.sourcecode442v083/Oniki_KinkyMod/Oniki/Settings.cs

Added (all default true):
- SelectableSimsAlwaysAcceptPlayerInputs
- SelectableSimsAlwaysPromptOnIncomingWooHoo
- DebugInteractionLogging
- LogKWStartup
- LogKWErrorOnQuit
- LogKWLocalizationOnQuit

Migration gate (aligned):
- PreviousVersion < 443 initializes all newly added keys above.

3) WooHoo behavior changes (WooHooSequence)
File: OKW.sourcecode442v083/Oniki_KinkyMod/Oniki.Interactions/WooHooSequence.cs

3.1 Selectable command override
- Added player-directed selectable control path for soft actor-side rejects.
- When SelectableSimsAlwaysAcceptPlayerInputs = true, manual selectable command path bypasses actor-side "willful" friction in the intended scoped flow.

3.2 Incoming prompt control
- Added selectable-target prompt policy controlled by SelectableSimsAlwaysPromptOnIncomingWooHoo.
- If enabled: selectable human target receives incoming prompt in covered incoming flows.
- If disabled: behavior returns to legacy prompt flow.

3.3 Scope refinements to avoid unintended force-accept
- NPC target autonomy/scoring is preserved (no global force-accept on non-selectable targets).
- Same-household selectable-to-selectable player-directed path keeps score-based acceptance to reduce spam and preserve intended realism.

4) Social interaction manual command friction pass
Applied actor-side player-command overrides (manual active selectable path only) in:
- Oniki.Interactions/Seduce.cs
- Oniki.Interactions/Tease.cs
- Oniki.Interactions/ShowBoobs.cs
- Oniki.Interactions/ShowBra.cs
- Oniki.Interactions/ShowBottom.cs
- Oniki.Interactions/ShowPanties.cs
- Oniki.Interactions/ShowFeet.cs
- Oniki.Interactions/Flash.cs
- Oniki.Interactions/Grope.cs
- Oniki.Interactions/FlashVoyeur.cs
- Oniki.Interactions/TeaseVoyeur.cs

Applied condition pattern:
- !base.Autonomous
- Main.Settings.SelectableSimsAlwaysAcceptPlayerInputs
- Actor.IsSelectable
- Actor.IsActiveSim

Non-goals preserved:
- no global NPC force-accept
- target-side acceptance logic remains score-based unless explicitly designed otherwise
- hard availability gates (Test/greyed-out constraints, stage/context constraints) remain intact

5) Grope and voyeur-specific final behavior
5.1 Grope
- Manual-start low-corruption blocker is bypassed only in scoped player-directed active selectable path.
- Target response/scoring branches remain unchanged.

5.2 FlashVoyeur / TeaseVoyeur
- Scoped bypass removes actor-side ambient exhibition friction for manual active selectable control path.
- Context and hard constraints remain preserved.

6) UI settings integration
6.1 WooHoo menu
File: Oniki.UI/OptionSettingMenuWooHoo.cs
- Added:
  - OptionSettingEnabledSimple("SelectableSimsAlwaysAcceptPlayerInputs")
  - OptionSettingEnabledSimple("SelectableSimsAlwaysPromptOnIncomingWooHoo")

6.2 Misc menu
File: Oniki.UI/OptionSettingMenuMisc.cs
- Added:
  - OptionSettingSimpleBool("LogKWStartup")
  - OptionSettingSimpleBool("LogKWErrorOnQuit")
  - OptionSettingSimpleBool("LogKWLocalizationOnQuit")
  - OptionSettingSimpleBool("DebugInteractionLogging")

7) Logging architecture and controls
7.1 Dedicated interaction log stream
Files:
- Oniki/Log.cs
- Oniki/UITools.cs
- Oniki.UI/DialogBox.cs
- Oniki/KinkyMod.cs

Added:
- Log.WriteInteraction(...)
- Log.DumpInteraction() with prefix KWInteractionLog_
- Log.ClearInteraction()
- UITools.LogInteractionFeedbackTrace(...)
- DialogBox trace hook in ShowInternal(...)

Per-entry payload includes:
- channel
- style (kSystemMessage / kSimTalking / kGameMessageNegative / DialogBox)
- resolved localization key (or RAW_TEXT_OR_UNKNOWN_KEY)
- actor/target descriptors and role tags
- displayed final text

7.2 World quit/export control wiring
File: Oniki/KinkyMod.cs
- Dump behavior now controlled by new toggles:
  - DebugInteractionLogging -> KWInteractionLog_ export
  - LogKWErrorOnQuit -> KWErrorLog_ export
  - LogKWLocalizationOnQuit -> KW_Localization export
- Reliability fix: toggle values captured before Shutdown() nulls settings, so abandon/quit without save still exports correctly.

7.3 Startup log toggle
File: Oniki/Main.cs
- KWStartup_ export now gated by LogKWStartup.

8) Upgrade popup and versioning
8.1 Hardcoded version bump
File: Oniki/KinkyMod.cs
- Updated to v0.8.5 / Build 443

8.2 Upgrade popup detail
File: Oniki/Main.cs
- Switched from:
  - ui/notifications/main:upgrade
- To:
  - ui/notifications/main:upgrade_detailed
- Parameters:
  - {0} = serialized detected build
  - {1} = current running build

9) Localization/STBL updates summary (manual package-side)
9.1 New option labels
- Oniki.KinkyMod.OptionSettings.SelectableSimsAlwaysAcceptPlayerInputs (0x1B052C342D2C4E5E)
- Oniki.KinkyMod.OptionSettings.SelectableSimsAlwaysPromptOnIncomingWooHoo (0xD1789083937EF94A)
- Oniki.KinkyMod.OptionSettings.DebugInteractionLogging (0xBA9F0E74B1C19F39)
- Oniki.KinkyMod.OptionSettings.LogKWStartup (0x2686CB3A220E5C66)
- Oniki.KinkyMod.OptionSettings.LogKWErrorOnQuit (0xB37B4A27D0FC9C01)
- Oniki.KinkyMod.OptionSettings.LogKWLocalizationOnQuit (0x523CFF010F7BF0F6)

9.2 Upgrade popup key
- Oniki.KinkyMod.ui/notifications/main:upgrade_detailed
- Hash observed in package flow: 0x45CFA33AFC795E88
- Text pattern: from build ({0.Number}) to build ({1.Number})

9.3 Rejection feedback cleanup
- Multiple AskForWooHoo/Interaction generic reject keys were updated in EN/IT for intelligible wording and player-facing clarity.
- Includes generic reject family and target-feedback family used in WooHoo/social rejection flows.

10) Build scripts and compatibility notes
- build.ps1 retained as legacy-safe path (csc 2.0 oriented constraints).
- build_experimental.ps1 retained as separate experimental path for modern syntax while preserving TS3 compatibility constraints in commandline output targeting.
- This changelog records MOSTLY source and workflow decisions; package-side STBL updates are aside, except where explicitely indicated (for the amount of strings involved).

11) Validation status
- In-game user smoke tests: PASS (latest reported pass)
- Confirmed:
  - mod loads
  - settings visible and persisted
  - selectable control behavior follows intended split
  - NPC autonomy/scoring preserved where required
  - log toggles and exports behave as expected

12) Remaining follow-up (optional)
- Additional reject wording consistency pass (where still desired).
- Optional expansion for direct StyledNotification callsites outside UITools wrappers.
- Optional future review of same-household requester/receiver UX policy.

13) 2026-03-18 - Interaction debug hash enrichment
File: Oniki/UITools.cs

- Updated "UITools.LogInteractionFeedbackTrace(...)" payload to include hash-oriented localization diagnostics:
  - "fnv64_exact": computed only when a concrete localization key is resolved.
  - "fnv64_candidate": computed as best-effort candidate when key resolution fails ("RAW_TEXT_OR_UNKNOWN_KEY"), using namespace-prefixed message fallback.
- Existing fields remain unchanged ("channel", "style", "key", actor/target roles, displayed text).
- Expected benefit:
  - faster STBL lookup workflow directly from "KWInteractionLog_" without manual hash calculation when key is known;
  - clearer distinction between exact key hash and heuristic candidate hash during localization debugging.

14) 2026-03-18 - Localization export quality + double-localization fix
Files:
- Oniki/UITools.cs
- Oniki.Interactions/WooHooSequence.cs
- Oniki.Situations/KWRepairmanSituation.cs

14.1 Localization export ("KW_LocalizationExport_") improvements
- Reworked non-localized registry from "hash -> entryKey" to tracked records with metadata:
  - "EntryKey"
  - "Count" (number of runtime hits)
  - "FirstSource"
  - "LastSource"
- Dump format now includes attributes:
  - "Key"
  - "Count"
  - "FirstSource"
  - "LastSource"
- Source tagging currently distinguishes the two main localization lookup paths:
  - "Localize(string,object[])"
  - "Localize(string,bool,bool,object[])"
- Goal:
  - make missing-localization dumps prioritizable and easier to triage.

14.2 Double-localization bug fix in message flow
- Added "WooHooSequence.SetMessageText(...)" for pre-localized strings.
- Existing "SetMessage(...)" remains key-based behavior (legacy semantics preserved).
- "WooHooSequence" now respects whether message payload is key-based or already localized text before applying "UITools.Localize(...)" in:
  - question display
  - accepted answer display
  - rejected answer display
- Updated callsites in "KWRepairmanSituation" that previously passed pre-localized text into "SetMessage(...)" to now use "SetMessageText(...)".
- Expected benefit:
  - prevents invalid "Oniki.KinkyMod.<already localized sentence>" entries in localization export;
  - cleaner missing-key reports with fewer false positives from runtime text re-localization.

15) 2026-03-20 - Towel recovery + look-at safety fixes
Files:
- Oniki.Gameplay/SwitchOutfitHelper.cs
- Oniki.UI/OptionSettingMenuGlobal.cs
- Oniki.Interactions/FlashVoyeur.cs
- Oniki.Interactions/ShowBottom.cs
- Oniki.Interactions/OraljobToDog.cs

15.1 Post-bath towel fallback hardening
- In "SwitchOutfitHelper" ("GettingOutOfBath" path), the special towel outfit is now used only when "GetSpecialOutfitIndexFromKey("towel") >= 0".
- If the towel special index is invalid, code now falls back to normal category selection instead of forcing "OutfitCategories.Special" with a bad index.
- Goal:
  - prevent random special-outfit swaps (for example unrelated EP special outfits) when towel mapping is stale or invalid.

15.2 New player action: towel regeneration
- Added a first towel-repair utility in Global settings below "UseTowelAfterBath".
- Action behavior (baseline implementation):
  - removed stale ""towel"" special mapping,
  - cleared "SkinnyDippingTowel",
  - recreated towel outfit and remapped special index.
- Note:
  - this first iteration was later migrated to Debug pie menu in item 16 for per-Sim targeted repair.

15.3 LookAt safety fixes (minimal, non-invasive)
- Patched high-confidence stuck-look paths without altering animation/state-machine choreography:
  - "FlashVoyeur.Run()": on "RouteToWindow()" failure, now disposes change-outfit helper and re-enables target LookAts before return.
  - "ShowBottom.PostSocialLoop()": target LookAts are re-enabled before early-return on missing "SimData".
  - "OraljobToDog.PostSocialLoop()": actor LookAts are now re-enabled (target was already restored).
- Goal:
  - reduce eye-crossed / gaze-lock artifacts caused by unmatched "DisableLookAts()" in early-exit paths.

16) 2026-03-18 - Towel repair moved to Sim Debug pie menu + hardcoded version bump
Files:
- Oniki.Interactions.Debug/Sim_RepairTowelMapping.cs
- Oniki.UI/OptionSettingMenuGlobal.cs
- Oniki_KinkyMod.csproj
- Oniki/KinkyMod.cs

16.1 Player-facing location change
- Removed "Regenerate towels" from Global settings menu.
- Added a new Sim interaction under:
  - "Kinky World... > Debug... > Repair towel mapping"
- Availability:
  - player-directed only,
  - requires Debug mode enabled,
  - valid on human non-toddler Sim targets.

16.2 Behavior and feedback
- Repair is now per-target Sim (clicked Sim), not a broad household/world pass.
- Uses warning-style notification ("kGameMessageNegative") for status/result feedback as requested.
- Includes anti-reentry guard to avoid stacking concurrent repair runs.

16.3 Repair workflow hardening retained
- Removes stale ""towel"" special mapping.
- Clears "SkinnyDippingTowel" entries.
- Recreates towel outfit using EP3 key candidates (standard + merged-age prefix fallback).
- Re-applies and validates ""towel"" special mapping, with remap retry if index is still invalid.

16.4 Version update
- Hardcoded snapshot updated to "v0.8.5" / "Build 443" (revision-only bump on same build line).

---------------------

STBL EDITING LOG

- Fixed some major inconsistencies from IT localization and rarely, slightly correcting what the EN reference was, especially when some actor>to>player notification were written as spoken to an NPC (marked as "FIXED"). In rare cases the text key was entirely missing and it has been added, both EN and IT (marked as "NEW"). Some of the keys are also reported with their original version, rather than with just fixed version.

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejected (0x0979C962B43056F2)
IT (NEW) > "Mmh... Decisamente no. Smettila."
OTHER LANGUAGES: added (when missing) from translation from original reference (EN)

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetAwkward (0x180C05CEC6FF8505)
EN (ORIGINAL)
IT > "No, è un po' imbarazzante... Non credi?"

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejectedPublic (0xFF8463C5641BF225)
EN (ORIGINAL)
IT > "No, è assurdo! Qualcuno potrebbe vederci qui!"

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejectedFatigued (0x4F44BEBBEB8560C7)
EN (ORIGINAL)
IT (NEW) > "Vorrei... Ma ho davvero bisogno di riposare adesso."

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejectedTired (0x2F91D93F85409AEC)
EN (FIXED) > "No... I feel too tired now. I need some sleep."
IT (NEW) > "Ho troppo sonno...Preferirei dormire, adesso."

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejectedHungry (0x1C9B2CEE79B895B1)
EN (FIXED) > "No... I feel too hungry right now. I need to eat something."
IT (NEW) > "No... Ho troppa fame. Devo mangiare qualcosa prima."

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:TargetRejectedRough (0xFDFEB551135EC031)
EN (FIXED) > "No... That's a bit too extreme for me."
IT (NEW) > "No... E' un po' troppo estremo per me."

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:WhoreRejected (0x575A12C54B9B7DA8)
EN (NEW) > "No... Don't you see I'm working? You'll have to pay for this right now, like anyone else."
IT > "No... Sto lavorando adesso. Dovresti pagarmi, come tutti gli altri."

Oniki.KinkyMod.AskForWooHoo.InteractionFeedback:ThreesomeAndMoreRejected (0x5856238CCF87F7BD)
EN (NEW) > "What? A group thing? I would never do that!"
IT >  "Che? Una cosa di gruppo? Non farei mai niente del genere!"

Oniki.KinkyMod.Interaction:WooHooRejectedFatigued (0x7E7D2FC8C96F31AD)
EN (ORIGINAL) > "Sorry, I'm just exhausted."
EN (FIXED) > "No... I'm just exhausted."
IT (NEW) > "No... Preferirei riposarmi adesso."

Oniki.KinkyMod.Interaction:WooHooRejectedHungry (0x1EC04492E74810BB)
EN (NEW) > "No... My hunger is killing me right now."
IT (NEW) > "No... Ho veramente troppa fame adesso."

Oniki.KinkyMod.Interaction:WooHooRejectedTired (0x9C1F252D862B6332)
EN (ORIGINAL) > "Sorry, I'm too tired"
EN (FIXED) > "No... I'm too tired for that. I need some sleep."
IT (NEW) > "No... Non posso. Ho troppo sonno adesso."

Oniki.KinkyMod.Interaction:GenericRejected > 0xAA4BE67EA0A5DDF8
EN (ORIGINAL) > No, I don't want to do that.
EN (FIXED - STRICTLY RELATED TO ONLY SCORE LOGIC) > "No, I don't want to do that. It's not that inspiring right now."
IT (ORIGINAL) > "No, non voglio farlo."
IT (FIXED) > "No, non voglio farlo. Non mi ispira molto adesso."

Oniki.KinkyMod.Interaction:GenericSoloRejected (0x938A821C6B6638A5)
EN (ORIGINAL) > "I'm not horny enough to masturbate."
EN (FIXED) > "I'm not really in the mood to masturbate."
IT (NEW) > "Non mi va adesso. Non sono nell'umore di masturbarmi."

Oniki.KinkyMod.Interaction:GenericRejectedPublic (0x5F399EE4535E0E43)
EN (ORIGINAL) > "No, I can't do that here. Someone might see us."
EN (FIXED - LESS IMPERATIVE) > "No, I can't do that here... Someone might see us."
IT (FIXED - LESS IMPERATIVE) > "Non voglio farlo qui...Qualcuno potrebbe vederci."

Oniki.KinkyMod.Interaction:GenericSoloRejectedPublic (0xFDC5F697E8EDC05E)
EN (FIXED) > "No...I don't want to do that here. Someone might see me."
IT (FIXED) > No... Non voglio farlo qui. Qualcuno potrebbe vedermi.

Oniki.KinkyMod.Interaction:GenericRejectedNoRoom (0xEDE005AB3ADB5D90)
EN (ORIGINAL)
IT (NEW) > "Mmh... Non c'è lo spazio adatto per farlo."

IT (NEW) > A LOT MORE (IT) STUFF THAT'S IMPOSSIBLE TO TRACE DOWN ENTIRELY BECAUSE IT'S TOO DAMN MUCH.
